<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
    // 原型链继承
    // function Person(){
    //   this.name = ['kk',"ee"]
    // }
    // Person.prototype.sayName = function(){
    //     console.log(this.name)
    // }
    // function Child(){

    // }
    // // 子类的原型为父类的实例
    // Child.prototype = new Person()
    // let child1 = new Child()
    // let child2 = new Child()
    // child1.name.push("oo")
    // console.log(child1.name)
    // console.log(child2.name)
    // 缺点：
    //   引用类型被所有实例共享
    //   创建子类实例的时候，无法向父类构造函数传参
    // 优点：1，简单易于实现。2，父类新增的原型的属性和方法，子类都能访问到
    // child1.sayName()
    // console.log(child1.sayName())
    // ——————————————————————————————————————————————————————————————————
    // 构造函数继承
    // function Person(name,age){
    //     this.arr = [1,2,3]
    //     this.name = name
    //     this.age = age
    //     this.getAge = function(){
    //         console.log(age)
    //     }
    // }
    // Person.prototype.sayName = function(){
    //     console.log(11)
    // }
    // function Child(name,age){
    //     // 在子类的构造函数中通过call()调用父类的构造函数
    //     Person.call(this,name,age)
        
    // } 
    // let child1 = new Child("kk","10")
    // let child2 = new Child("ee","20")
    // child1.arr.push(4)
    // console.log(child1.arr)
    // console.log(child2.arr)
    // 优点：
    // 1，实现多继承
    // 2，避免了引用类型被所有实例共享
    // 3，在子类中向父类传参
    //  缺点：
    // 1，只能继承父类的属性和方法，不能继承原型的属性和方法
    // 2，方法在构造函数中定义，每次创建实例都会创建一遍，影响性能
    // 3，实例并不是父类的实例，而是子类的实例
    // ——————————————————————————————————————————————————————————————————————————————————————
    // 组合继承
    function Person(name){
        this.name = name;
        this.color = ['red','yellow']
    }
    Person.prototype.getName = function(){
        console.log(this.name)
    }
    function Child(name,age){
        Person.call(this,name)
        this.age = age
    }
    Child.prototype = new Person()
    Child.prototype.constructor = Child
    let child1 = new Child("keke","24")    
    let child2 = new Child("keke","26")    
    child1.color.push("orange")
    console.log(child1.name)
    console.log(child1.age)
    console.log(child1.color)

    console.log(child2.color)
// 优点：融合原型继承和构造函数的优点
// 1，可以继承实例的属性和方法，也可以继承原型的属性和方法
// 2，不存在引用类型的属性被所有实例共享
// 3，可以向父类传参
// 4，函数可复用
// 缺点：
// 1，调用两次构造函数，一次是在创建子类原型的时候，一次是子类型构造函数的内部，
// 2，调用了两次构造函数，生成了两份实例



    </script>
</body>
</html>